<?php

namespace app\admin\command;

use think\console\Command;
use think\console\Input;
use think\console\Output;
use think\Db;

/**
 * 生成员工绩效数据命令
 */
class GenerateEmployeePerformance extends Command
{
    protected function configure()
    {
        $this->setName('generate:employee-performance')
            ->setDescription('生成员工绩效统计数据');
    }

    protected function execute(Input $input, Output $output)
    {
        $output->writeln('开始生成员工绩效数据...');
        
        // 生成昨天的数据
        $yesterday = date('Y-m-d', strtotime('-1 day'));
        $this->generateData($yesterday, $yesterday);
        
        $output->writeln('员工绩效数据生成完成！');
    }
    
    /**
     * 生成指定日期的员工绩效数据
     */
    private function generateData($startDate, $endDate)
    {
        // 从报工表通过分配表关联员工信息统计员工绩效数据
        $reportData = Db::name('scanwork_report')
            ->alias('r')
            ->join('scanwork_allocation a', 'r.allocation_id = a.id')
            ->join('user u', 'a.user_id = u.id')
            ->where('r.status', 1) // 只统计已确认的报工
            ->where('FROM_UNIXTIME(r.report_time)', 'between', [$startDate, $endDate])
            ->field('
                a.user_id as employee_id,
                DATE(FROM_UNIXTIME(r.report_time)) as stat_date,
                COUNT(*) as completed_tasks,
                SUM(r.quantity) as output_quantity,
                SUM(r.wage) as total_wage,
                AVG(r.wage/r.quantity) as avg_price
            ')
            ->group('a.user_id, DATE(FROM_UNIXTIME(r.report_time))')
            ->select();
        
        foreach ($reportData as $data) {
            // 检查是否已存在该日期的统计数据
            $exists = Db::name('scanwork_employee_performance')
                ->where('employee_id', $data['employee_id'])
                ->where('stat_date', $data['stat_date'])
                ->find();
            
            if (!$exists) {
                // 计算绩效评分
                $performanceScore = $this->calculatePerformanceScore($data);
                
                // 计算质量评分和效率评分
                $qualityRate = $this->calculateQualityRate($data);
                $efficiencyRate = $this->calculateEfficiencyRate($data);
                
                // 插入统计数据
                Db::name('scanwork_employee_performance')->insert([
                    'stat_date' => $data['stat_date'],
                    'stat_type' => 'daily',
                    'employee_id' => $data['employee_id'],
                    'completed_tasks' => $data['completed_tasks'],
                    'output_quantity' => $data['output_quantity'],
                    'total_wage' => $data['total_wage'],
                    'quality_rate' => $qualityRate,
                    'efficiency_rate' => $efficiencyRate,
                    'performance_score' => $performanceScore,
                    'createtime' => time()
                ]);
            }
        }
    }
    
    /**
     * 计算绩效评分
     */
    private function calculatePerformanceScore($data)
    {
        // 简单的绩效评分算法，可以根据实际业务需求调整
        $baseScore = 60; // 基础分
        $taskScore = min($data['completed_tasks'] * 2, 20); // 任务完成加分，最高20分
        $outputScore = min($data['output_quantity'] * 0.1, 15); // 产出加分，最高15分
        $wageScore = min($data['total_wage'] * 0.01, 5); // 工资加分，最高5分
        
        return $baseScore + $taskScore + $outputScore + $wageScore;
    }
    
    /**
     * 计算质量评分
     */
    private function calculateQualityRate($data)
    {
        // 基于报工数据计算质量评分
        if ($data['output_quantity'] > 0 && $data['total_wage'] > 0) {
            // 质量评分 = 基础分 + 产出效率加分
            $baseQuality = 85; // 基础质量分
            $efficiencyBonus = min(($data['output_quantity'] / $data['completed_tasks']) * 2, 10); // 效率加分，最高10分
            return min($baseQuality + $efficiencyBonus, 100); // 最高100分
        }
        
        return 85; // 默认质量分
    }
    
    /**
     * 计算效率评分
     */
    private function calculateEfficiencyRate($data)
    {
        // 基于报工数据计算效率评分
        // 效率 = 产出数量 / 完成任务数 * 100
        
        if ($data['completed_tasks'] > 0) {
            $efficiency = ($data['output_quantity'] / $data['completed_tasks']) * 100;
            return min($efficiency, 200); // 最高200%效率
        }
        
        return 100; // 默认100%效率
    }
}
